String.method('deentityify', function () {
    // 字符实体表。它映射字符实体的名字到对应的字符。
    var entity = {
        quot: '"',
        lt: '<',
        gt: '>'
    };

    // 返回 deentityify 方法
    return function () {
        // 这才是 deentifyify 方法。
        // 它调用字符创的 replace 方法，查找‘&’开头和‘；’结束的字符串，如果这些字符可以在字符实体表中找到，那么就将该字符字体替换为映射表中的值。\
        // 它用到了一个正则表达式。
        return this.replace(/&([^&;]+);/g, function (a, b) {
            var r = entity[b];
            return typeof r === 'string' ? r : a;
        });
    };
}());


var serial_maker = function () {
    // 返回一个用来产生唯一字符串的对象
    // 唯一字符串由两部分组成：前缀 + 序列号
    // 该对象包含一个设置前缀的方法，一个设置序列号的方法
    // 和一个产生唯一字符串的 gensym 方法
    var prefix = '';
    var seq = 0;
    return {
        set_prefix: function (p) {
            prefix = String(p);
        },
        set_seq: function (s) {
            seq = s;
        },
        gensym: function () {
            var result = prefix + seq;
            seq += 1;
            return result;
        }
    };
};

var seqer = serial_maker();
seqer.set_prefix('Q');
seqer.set_seq(1000);
var unique = seqer.gensym();